【AWS】EC2のヘルスチェックを意図的に失敗させる
はじめに
こんにちは植木和樹です。AWSでシステムを構築した際には障害試験を実施する機会があるかと思います。冗長構成としたサーバーで片系に障害が起きてもサービスは停止しないか?監視システムが正しくそれを検知し通知は行われるか?などです。
さてEC2のヘルスチェックに失敗した場合に、自動的に監視システムからインスタンス再起動が行われるかを確認したいとします。この場合はどうやってヘルスチェックを失敗させればいいのか。本日は備忘録としてその方法を書き留めておきます。
ここに記載したヘルスチェックを失敗させる方法はAWS非公式の方法です。将来的に挙動が変更になるかもしれませんのでご注意ください。 またこの作業を行ったことによるデータ損失等は当方一切の責任を負いかねますのでご理解いただいた上でお試しください。
ヘルスチェックを失敗させる方法
ヘルスチェックにはSystem status checks(仮想ホストレベル)とInstance status checks(OSレベル)の2種類があります。System Status checksを失敗させるのは難しいので、Instance status checksを失敗させてみましょう。
Linuxの場合
eth0のネットワークインターフェースをダウンさせることでヘルスチェックを失敗させることができます。ダウンさせるにはroot権限で次のコマンドを実行します。
# ifconfig eth0 down
実行した瞬間にsshの接続も切断されるので気をつけてください。最長5分ほど待ち、マネージメントコンソールの”Status Checks"が"1/2 checks passed"に変化して黄色いビックリマークのアイコンが表示されたら成功(?)です。
一時的にインターフェースをダウンさせただけなので、インスタンスをSTOP→STARTさせれば再度sshで接続できるようになります。なおこの状態だとReboot Actionは受け付けてくれないようです。必ずSTOP→STARTしましょう。
Windowsの場合
"DHCP Client"サービスを停止させることでヘルスチェックを失敗させることができます。やはり実行した瞬間にリモートデスクトップ接続が切断されます。
管理ツールの"サービス"を見つけられない場合はコマンドプロンプトからnet stop "DHCP Client"を実行してもOKです。関連するサービスもまとめて停止して良いか確認してきますので"Y"を入力して処理を進めてください。
一時的にインターフェースをダウンさせただけなので、インスタンスをSTOP→STARTさせれば再度リモートデスクトップで接続できるようになります。またWindowsもこの状態だとReboot Actionは受け付けてくれないようです。STOP→STARTしましょう。
まとめ
EC2のInstance status checksはサーバー外部からネットワークを使って監視をしているようです。そのためネットワークを切断すればヘルスチェックに失敗するようですね。
なおLinuxの場合は、sshdサービスを停止させたり、iptablesで全パケットをDROPさせてもヘルスチェックは正常ステータスなままでした。つまりネットワーク的には異常な状態でも、ヘルスチェックは検知してくれないようです。EC2のヘルスチェックは過信せず、他のモニタリングシステムと組み合わせて監視することが大切ですね。